半夜某宝的225突然过不了了,看了半天参数,没看出来,写了一个环境自吐直接看缺了什么,借助了chatgpt的一些提示,如果有不正确的地方请指正。(仅供学习使用) 第三版增加了递归和排版
window = new function monitorWindow() {
const MAX_VALUE_LENGTH = 70;
// 截取 value
function truncateValue(value) {
if (typeof value === 'string' && value.length > MAX_VALUE_LENGTH) {
return `${value.substring(0, MAX_VALUE_LENGTH)}...`;
} else if (typeof value === 'object') {
const keys = Object.keys(value);
if (keys.length > 2) {
return `{${keys.slice(0, 3).map(key => `${key}: ${serializeValue(value[key])}`).join(', ')}...}`
} else {
return `{${keys.map(key => `${key}: ${value[key]}`).join(', ')}}`;
}
} else {
return value;
}
}
// 序列化 value
function serializeValue(value) {
if (typeof value === 'object') {
try {
return JSON.stringify(value);
} catch {
return value;
}
}
return value;
}
function createHandler(name) {
return {
get(target, key, receiver) {
if (key === Symbol.unscopables || key === 'toString' || key === 'valueOf') {
return Reflect.get(target, key, receiver);
}
const value = Reflect.get(target, key, receiver);
if (String(key) === "Symbol(impl)" || truncateValue(serializeValue(name)).includes("Symbol(impl)")){
return value;
}
if (typeof value === 'function' && /^function\s+[A-Za-z]+\(\)/.test(value.toString())) {
// 代理函数的构造函数
return new Proxy(value, {
construct(target, args, newTarget) {
console.log(`调用了构造函数: ${String(key).padEnd(22, " ")} |"参数": ${JSON.stringify(args)}`);
return Reflect.construct(target, args, newTarget);
},
});
}
if (value != null && (typeof value === 'object' || typeof value === 'function')) {
// 代理对象的属性访问和设置
console.log(`访问: "${(String(key)+"\"属性").padEnd(30, " ")}|"${(truncateValue(serializeValue(name))+"\"对象").padEnd(50, " ")}|值=`, truncateValue(serializeValue(value)));
return new Proxy(value, createHandler(`${String(name)}.${String(key)}`));
}
if (String(key) === "Symbol(impl)" || truncateValue(serializeValue(name)).includes("Symbol(impl)")){
return value;
}
// 不进行代理的属性或方法
console.log(`获取: "${(String(key)+"\"属性").padEnd(30, " ")}|"${(truncateValue(serializeValue(name))+"\"对象").padEnd(50, " ")}|值=`, truncateValue(serializeValue(value)));
return value;
},
set(target, key, value, receiver) {
console.log(`设置对象: "${(String(key)+"\"").padEnd(28, " ")}|"${(truncateValue(serializeValue(name))+"\"对象").padEnd(50, " ")}|值=`, truncateValue(serializeValue(value)));
return Reflect.set(target, key, value, receiver);
},
apply(target, thisArg, args) {
console.log(`调用了函数: ${(String(target.name)).padEnd(27, " ")}|"${(truncateValue(serializeValue(name))+"\"对象").padEnd(50, " ")}|参数= ${truncateValue(serializeValue(args))}`);
return Reflect.apply(target, thisArg, args);
},
construct(target, args, newTarget) {
console.log(`调用了构造函数: ${String(target.name)}|"${(truncateValue(serializeValue(name))+"\"对象").padEnd(50, " ")}|参数= ${JSON.stringify(args)}`);
return Reflect.construct(target, args, newTarget);
},
};
}
return new Proxy(window, createHandler('window'));
}
1.某宝
2.某夕夕
|